package utils;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.Frame;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import org.apache.log4j.Logger;
public class FileUtilities {
private static final Logger logger = Logger.getLogger(FileUtilities.class);
private static int preferedWidth = 650;
private static int preferedHeight = 450;
public static File selectOpenFileViaChooser(File suggestedFile, Component parentComponent){
File selectedFile = null;
// If mac or windows open FileDialog
// I have skipped using Native FileUtils in mac - it is sometimes crashing
// Only for some Windos VM is it used
if(OSNativeUtils.isRunningDefectJFilechooserJVM()) {
// get Frame
Component root = SwingUtilities.getRoot(parentComponent);
Frame parentFrame = null;
if (root instanceof Frame) {
parentFrame = (Frame) root;
}
// use the native file dialog
FileDialog dialog = new FileDialog(parentFrame, "Open",FileDialog.LOAD);
dialog.setDirectory(suggestedFile.getParent());
dialog.setVisible(true);
String fileDirectory = dialog.getDirectory();
String fileName = dialog.getFile();
if(fileName != null){
selectedFile = new File(fileDirectory, fileName);
}
}
else{
// Else JFileChooser
// Set readOnly to avoid rename of file by slow double click
Boolean old = UIManager.getBoolean("FileChooser.readOnly");
UIManager.put("FileChooser.readOnly", Boolean.TRUE);
JFileChooser fc = new JFileChooser(suggestedFile);
fc.setPreferredSize(new Dimension(preferedWidth, preferedHeight));
/*
AbstractButton button = SwingUtilities.getDescendantOfType(AbstractButton.class,
fc, "Icon", UIManager.getIcon("FileChooser.detailsViewIcon"));
button.doClick();
*/
int returnVal = fc.showOpenDialog(parentComponent);
UIManager.put("FileChooser.readOnly", old);
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedFile = fc.getSelectedFile();
} else {
selectedFile = null;
}
preferedWidth = fc.getSize().width;
preferedHeight = fc.getSize().height;
}
System.out.println("selectedfile" + selectedFile);
return selectedFile;
}
public static File selectSaveFileViaChooser(File suggestedFile, Component parentComponent){
File selectedFile = null;
if(OSNativeUtils.isRunningDefectJFilechooserJVM()) {
// get Frame
Component root = SwingUtilities.getRoot(parentComponent);
Frame parentFrame = null;
if (root instanceof Frame) {
parentFrame = (Frame) root;
}
// use the native file dialog on the mac
FileDialog dialog = new FileDialog(parentFrame, "Save",FileDialog.SAVE);
dialog.setDirectory(suggestedFile.getParent());
dialog.setFile(suggestedFile.getName());
dialog.setVisible(true);
String fileName = dialog.getFile();
String directory = dialog.getDirectory();
if(fileName != null && directory != null){
selectedFile = new File(directory, fileName);
}
}
else{
// Else JFileChooser
// No good with for save filechooser because then you can not create dir
// UIManager.put("FileChooser.readOnly", Boolean.TRUE);
// Cannot set file in constructor, then only directory and not also filename is suggested in chooser
JFileChooser fc = new JFileChooser();
// Additional field
// JTextField field = new JTextField("Hello, World");
// JPanel fcPanel = new JPanel();
// fcPanel.setLayout(new BorderLayout());
// fcPanel.add(fc, BorderLayout.CENTER);
// fcPanel.add(field, BorderLayout.SOUTH);
// end additional
fc.setSelectedFile(suggestedFile);
fc.setPreferredSize(new Dimension(preferedWidth, preferedHeight));
int returnVal = fc.showSaveDialog(parentComponent);
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedFile = fc.getSelectedFile();
} else {
selectedFile = null;
}
preferedWidth = fc.getSize().width;
preferedHeight = fc.getSize().height;
}
return selectedFile;
}
}